package com.cn.ycy.service;

import com.cn.ycy.CompentScanConfig;
import com.cn.ycy.dao.UserMapper;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TransactionTest {

    UserMapper bean;

    UserMapperServiceImpl userMapperService;

    UserMapperTranstationServiceImpl userMapperTranstationService;

    @Before
    public void before() {
        AnnotationConfigApplicationContext annotationConfigApplicationContext =
                new AnnotationConfigApplicationContext(CompentScanConfig.class);

        // 演示事务的传播性质
        bean = annotationConfigApplicationContext.getBean(UserMapper.class);
        // 演示事务的传播性质
        bean = annotationConfigApplicationContext.getBean(UserMapper.class);
        userMapperService = annotationConfigApplicationContext.getBean(UserMapperServiceImpl.class);
        userMapperTranstationService = annotationConfigApplicationContext.getBean(UserMapperTranstationServiceImpl.class);
    }

    @Test
    public void insert0() {
        userMapperTranstationService.insert10and10();
    }

    @Test
    public void insert10() {
        userMapperTranstationService.insert10and11();
    }

    /**
     * 问题：在一个事务中 第一次 数据库操作 使用try去补捕获异常，第二次 数据库操作 会报异常 rollback-only
     * org.springframework.transaction.UnexpectedRollbackException:
     *  Transaction rolled back because it has been marked as rollback-only
     *
     *  第一次的异常 虽然手动捕获了。但是这个抛出异常的方法是加了@Transcation注解的，已经spring的事务传播机制捕获了，
     *  所以标志当前的connection为Transaction 为rollback-only，意思就是必须回滚。
     *  最后 最外层commit时，校验当前Trancation 标识为 rollback-only ，因此直接回滚了。
     *
     */
    @Test
    public void rollerbackExp() {
        userMapperTranstationService.rollerbackExp();
    }


}
